package org.atlantis.grosbeak.depot.weaver;

import org.atlantis.grosbeak.depot.DepotMaker;
import org.atlantis.grosbeak.depot.proxy.ValueProxy;
import org.atlantis.grosbeak.lang.Mirror;
import org.atlantis.grosbeak.lang.inject.Injecting;

/**
 * 字段值的注入器。通过值描述（ValueProxy）和注入方式（Injecting）类给一个字段注入值。
 * 
 * @author <a href="mailto:seenoevil.cn@gmail.com">SeeNoEvil</a>
 * 
 */
public class FieldInjector {

	private ValueProxy vp;
	private Injecting inj;

	private FieldInjector() {
	}

	/**
	 * 给指定对象（obj）注入值。
	 * 
	 * @param maker
	 *            DepotMaker对象。
	 * @param obj
	 *            需要注入值的对象。
	 */
	void inject(DepotMaker maker, Object obj) {
		Object value = vp.get(maker);
		inj.inject(obj, value);
	}

	/**
	 * 创建一个字段值注入器的实例。
	 * 
	 * @param mirror
	 *            反射工具类。
	 * @param fieldName
	 *            字段名。
	 * @param vp
	 *            值描述。
	 * @return 字段值注入器实例。
	 */
	public static FieldInjector instance(Mirror<?> mirror, String fieldName,
			ValueProxy vp) {
		FieldInjector fi = new FieldInjector();
		fi.vp = vp;
		fi.inj = mirror.getInjecting(fieldName);
		return fi;
	}
}
